﻿using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using Telerik.Web.UI;
using SMA.GENTEv1;

public partial class Protegidos_Empresas__popup_eppUploadConvMedColetivo : PageBase
{
    private const int ItemsPerRequest = 10;
    private int idContrato = 0;
    private const string dbPath = "arq/";

    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            if (Request.QueryString["IdContrato"] != null)
                idContrato = int.Parse(Request.QueryString["IdContrato"].ToString());

            if (!IsPostBack)
            {
                VerificaCMColetivo();
                EditaParametros();
            }
        }
        catch (Exception ex)
        {
            ExibirMensagem(true, ex.Message);
        }
    }

    #region Eventos
    protected void btnGravar_Click(object sender, EventArgs e)
    {
        try
        {
            BindValidResults();
            ExibeResultado();
            ExibirMensagem(false, "Operação efetuada com sucesso!");
        }
        catch (Exception ex)
        {
            ExibirMensagem(true, ex.Message);
        }
    }

    protected void btnFechar_Click(object sender, EventArgs e)
    {
        ClientScript.RegisterStartupScript(Page.GetType(), "mykey", "CloseAndRebind();", true);
    }

    protected void RadAjaxManager1_AjaxRequest(object sender, AjaxRequestEventArgs e)
    {
        //if (e.Argument == "RebindContrato")
        //{
        //    RadGrid2.MasterTableView.SortExpressions.Clear();
        //    RadGrid2.MasterTableView.GroupByExpressions.Clear();
        //    RadGrid2.MasterTableView.CurrentPageIndex = RadGrid2.MasterTableView.PageCount - 1;
        //    RadGrid2.Rebind();
        //    CarregarDadosContrato();
        //}
    }

    protected void rcbFornecedor_ItemsRequested(object o, RadComboBoxItemsRequestedEventArgs e)
    {
        try
        {
            OrganizacaoPrestadorServicoProduto prestador = new OrganizacaoPrestadorServicoProduto();
            List<OrganizacaoPrestadorServicoProduto> listPrestador = new List<OrganizacaoPrestadorServicoProduto>();

            listPrestador = prestador.SelectFornecedor(IdPrestador, e.Text, 5);

            int itemOffset = e.NumberOfItems;
            int endOffset = Math.Min(itemOffset + ItemsPerRequest, listPrestador.Count);
            e.EndOfItems = endOffset == listPrestador.Count;

            for (int i = itemOffset; i < endOffset; i++)
            {
                rcbFornecedor.Items.Add(new RadComboBoxItem(listPrestador[i].FornecedorServicoProduto.OrganizacaoFornecedor.RazaoSocial, listPrestador[i].FornecedorServicoProduto.IdFornecedorServicoProduto.ToString()));
            }

            e.Message = GetStatusMessage(endOffset, listPrestador.Count);
        }
        catch (Exception ex)
        {
            ExibirMensagem(true, ex.Message);
        }
    }

    protected void rcbFornecedor_SelectedIndexChanged(object o, RadComboBoxSelectedIndexChangedEventArgs e)
    {
        try
        {
            if (rcbFornecedor.SelectedValue != string.Empty)
            {
                trLocalidade.Visible = true;
                CarregaLocalidade(rcbLocalidade);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    protected void rcbLocalidade_SelectedIndexChanged(object o, RadComboBoxSelectedIndexChangedEventArgs e)
    {
        try
        {
            if (rcbLocalidade.SelectedValue != string.Empty)
                trServico.Visible = true;
        }
        catch (Exception ex)
        {
            ExibirMensagem(true, ex.Message);
        }
    }

    protected void rcbServico_ItemsRequested(object o, RadComboBoxItemsRequestedEventArgs e)
    {
        try
        {
            FornecedorServicoProduto servicoProduto = new FornecedorServicoProduto();
            List<FornecedorServicoProduto> listServicoPrestador = new List<FornecedorServicoProduto>();

            int idLocalidade = (rcbLocalidade.SelectedValue == string.Empty) ? 0 : int.Parse(rcbLocalidade.SelectedValue);

            listServicoPrestador = servicoProduto.SelectServicosProdutos(e.Text, IdPrestador, idLocalidade, 5);

            int itemOffset = e.NumberOfItems;
            int endOffset = Math.Min(itemOffset + ItemsPerRequest, listServicoPrestador.Count);
            e.EndOfItems = endOffset == listServicoPrestador.Count;

            for (int i = itemOffset; i < endOffset; i++)
            {
                rcbServico.Items.Add(new RadComboBoxItem(listServicoPrestador[i].TipoServicoProduto.Descricao, listServicoPrestador[i].IdFornecedorServicoProduto.ToString()));
            }

            e.Message = GetStatusMessage(endOffset, listServicoPrestador.Count);
        }
        catch (Exception ex)
        {
            ExibirMensagem(true, ex.Message);
        }
    }

    protected void rcbServico_SelectedIndexChanged(object o, RadComboBoxSelectedIndexChangedEventArgs e)
    {
        try
        {
            trDataEntrega.Visible = true;
            CarregaDataTipoServico(rcbDataEntrega);
        }
        catch (Exception ex)
        {
            ExibirMensagem(true, ex.Message);
        }
    }
    #endregion

    #region Metodos
    private void VerificaCMColetivo()
    {
        try
        {
            ProcessoContrato processoContrato = new ProcessoContrato();
            bool possuiCMColetivo = processoContrato.RetornaProtocoloColetivoBeneficio(idContrato, (int)TipoBeneficio.TipoBenef.Convenio_Medico);

            if (!possuiCMColetivo)
            {
                ExibeResultado();
                trResultado.Visible = false;

                string msgUsoProtocolo = "ATENÇÃO!!! Para o contrato selecionado pelo usuário, não foi identificado parametrização para uso de protocolo do Convênio Médico Coletivo.";
                msgUsoProtocolo += " Primeiro, configure para este contrato o uso de protocolo de Convênio Médico Coletivo e, após essa configuração";
                msgUsoProtocolo += ", retorne para esta mesma página para efetuar o upload.";

                throw new Exception(msgUsoProtocolo);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    private void BindValidResults()
    {
        try
        {
            if ((RadUpload1.UploadedFiles.Count > 0) || (lblArquivo.Text != string.Empty))
            {
                string nameFile = Salvar();

                foreach (UploadedFile validFile in RadUpload1.UploadedFiles)
                {
                    string targetFolder = Server.MapPath("~/Arq");
                    validFile.SaveAs(Path.Combine(targetFolder, nameFile), true);
                }

                labelNoResults.Visible = false;
                repeaterResults.Visible = true;
                repeaterResults.DataSource = RadUpload1.UploadedFiles;
                repeaterResults.DataBind();
            }
            else
            {
                labelNoResults.Visible = true;
                repeaterResults.Visible = false;
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    private string Salvar()
    {
        try
        {
            BeneficioOrganizacaoDocto beneficio = new BeneficioOrganizacaoDocto();

            beneficio.Organizacao = new Organizacao(IdPrestador);
            beneficio.TipoBeneficio = new TipoBeneficio((int)TipoBeneficio.TipoBenef.Convenio_Medico, false);
            if (rcbLocalidade.SelectedValue != string.Empty)
                beneficio.Localidade = new Cidade(int.Parse(rcbLocalidade.SelectedValue));
            beneficio.TipoPagamento = new TipoPagamento(16); // Fixado código para tipo de pagamento em Convênio Médico quando for entrega única

            if ((rcbLocalidade.SelectedValue != string.Empty) && (rcbFornecedor.SelectedValue != string.Empty))
            {
                int idFornecedor = (rcbFornecedor.SelectedValue == string.Empty) ? 0 : int.Parse(rcbFornecedor.SelectedValue);
                
                OrganizacaoPrestadorServicoProduto prestadorServicoProduto = new OrganizacaoPrestadorServicoProduto();
                int idPrestadorServicoProduto = prestadorServicoProduto.RetornaIdPrestadorServicoProduto(IdPrestador, beneficio.Localidade.IdCidade, idFornecedor);

                beneficio.ServicoPrestador = new OrganizacaoPrestadorServicoProduto() { IdPrestadorServicoProduto = idPrestadorServicoProduto };
            }

            if (rcbDataEntrega.Text != string.Empty)
                beneficio.DtValidade = DateTime.Parse(rcbDataEntrega.Text);
            beneficio.Path = dbPath;
            beneficio.Salvar();

            FileInfo _fileInfo = new FileInfo(beneficio.Path);

            return _fileInfo.Name;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    private void ExibeResultado()
    {
        try
        {
            trSeleciona.Visible = false;
            trResultado.Visible = true;
            trMsg.Visible = false;
            btnGravar.Visible = false;

            trFornecedor.Visible = false;
            trLocalidade.Visible = false;
            trServico.Visible = false;
            trDataEntrega.Visible = false;
        }
        catch (Exception ex)
        {
            throw ex;
        }

    }

    private void CarregaLocalidade(RadComboBox combo)
    {
        try
        {
            BeneficioOrganizacaoDocto beneficio = new BeneficioOrganizacaoDocto();

            combo.DataTextField = "NomeCidade";
            combo.DataValueField = "IdCidade";
            combo.DataSource = beneficio.CarregarLocalidadesBeneficioColetivo((int)TipoBeneficio.TipoBenef.Convenio_Medico, IdPrestador, idContrato);
            combo.DataBind();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    private void CarregaDataTipoServico(RadComboBox combo)
    {
        try
        {
            int idLocalidade = (rcbLocalidade.SelectedValue == string.Empty) ? 0 : int.Parse(rcbLocalidade.SelectedValue);
            int idFornecedor = (rcbServico.SelectedValue == string.Empty) ? 0 : int.Parse(rcbServico.SelectedValue);

            OrganizacaoPrestadorServicoProduto servicoPrestador = new OrganizacaoPrestadorServicoProduto();
            servicoPrestador.CarregarDataServicoProduto(IdPrestador, idLocalidade, idFornecedor);

            for (int i = 0; i < servicoPrestador.DataServicoProduto.Count; i++)
            {
                combo.Items.Add(new RadComboBoxItem(servicoPrestador.DataServicoProduto[i].Data.ToString("dd/MM/yyyy"), servicoPrestador.DataServicoProduto[i].IdPrestadorServicoProdutoData.ToString()));
            }
            combo.EmptyMessage = "Selecione uma data de entrega";
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    private void CarregaTamanhoDocto(int idTipoDocumento)
    {
        try
        {
            // seta o tamanho máximo do arquivo
            TipoDocumento tipodocto = new TipoDocumento(idTipoDocumento);
            RadUpload1.MaxFileSize = tipodocto.TamanhoDocumento;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    private void EditaParametros()
    {
        try
        {
            CarregaTamanhoDocto((int)TipoDocumento.TipoDocto.Beneficios_CM);
            OcultaCampos(true);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    private int RetornaTipoPeriodicidade(int idContrato, int idLocalidade)
    {
        try
        {
            int resultado = 0;

            List<WorkflowConfigData> listWfConfigData = new List<WorkflowConfigData>();
            WorkflowConfigData WfConfigData = new WorkflowConfigData();

            listWfConfigData = WfConfigData.BuscarPeriodicidade((int)TipoBeneficio.TipoBenef.Convenio_Medico, idContrato, idLocalidade);

            if (listWfConfigData.Count > 0)
                resultado = listWfConfigData[0].TipoPeriodicidade.IdTipoPeriodicidade;

            return resultado;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    private static string GetStatusMessage(int offset, int total)
    {
        try
        {
            if (total <= 0)
                return "No matches";

            return String.Format("Items <b>1</b>-<b>{0}</b> de <b>{1}</b>", offset, total);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    private void ExibirMensagem(bool _msgErro, string _textoMsg)
    {
        try
        {
            OcultaMsgPagina(false);
            if (_msgErro)
            {
                lblResultado.ForeColor = System.Drawing.Color.Red;
                lblResultado.Text = _textoMsg;
            }
            else
            {
                lblResultado.ForeColor = System.Drawing.Color.Black;
                lblResultado.Text = _textoMsg;
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    private void OcultaCampos(bool oculta)
    {
        try
        {
            trResultado.Visible = !oculta;
            trLocalidade.Visible = !oculta;
            trServico.Visible = !oculta;
            trDataEntrega.Visible = !oculta;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    private void OcultaMsgPagina(bool oculta)
    {
        try
        {
            trMensagem.Visible = !oculta;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    #endregion
}
